﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using QuanLyNganHangDe.DAL.Models;
using System.IO;

namespace QuanLyNganHangDe.BLL
{
    static class BizDeInRa
    {
        private static string _AppDir = null;
        private static string AppDir
        {
            get
            {
                if (string.IsNullOrEmpty(_AppDir))
                {
                    var codeBase = System.Reflection.Assembly.GetExecutingAssembly().CodeBase;
                    var uri = new UriBuilder(codeBase);
                    var path = Uri.UnescapeDataString(uri.Path);
                    _AppDir = System.IO.Path.GetDirectoryName(path);
                }
                return _AppDir;
            }
        }

        #region public static string MauDeThiVaDapAnRtfCode {}
        private static string _MauDeThiVaDapAnRtfCode = string.Empty;
        /// <summary>
        /// Mã RTF của mẫu đề thi
        /// Được lưu ở tệp StartupPath/TEMPLATE/MauDeThiVaDapAn.rtf
        /// </summary>
        public static string MauDeThiVaDapAnRtfCode
        {
            get
            {
                if (string.IsNullOrEmpty(_MauDeThiVaDapAnRtfCode))
                {
                    var stPath = System.IO.Path.Combine(AppDir, "TEMPLATE", "MauDeThiVaDapAn.rtf");
                    _MauDeThiVaDapAnRtfCode = System.IO.File.ReadAllText(stPath);
                }
                return _MauDeThiVaDapAnRtfCode;
            }
        }
        #endregion

        #region public static string MauDeThiRtfCode
        private static string _MauDeThiRtfCode = string.Empty;
        /// <summary>
        /// Mã RTF của mẫu đề thi
        /// Được lưu ở tệp StartupPath/TEMPLATE/MauDeThi.rtf
        /// </summary>
        public static string MauDeThiRtfCode
        {
            get
            {
                if (string.IsNullOrEmpty(_MauDeThiRtfCode))
                {
                    var stPath = System.IO.Path.Combine(AppDir, "TEMPLATE", "MauDeThi.rtf");
                    _MauDeThiRtfCode = System.IO.File.ReadAllText(stPath);
                }
                return _MauDeThiRtfCode;
            }
        }
        #endregion

        #region public static string MauDapAnRtfCode {}
        private static string _MauDapAnRtfCode = string.Empty;
        /// <summary>
        /// Mã RTF của mẫu đáp án
        /// Được lưu ở tệp StartupPath/TEMPLATE/MauDapAn.rtf
        /// </summary>
        public static string MauDapAnRtfCode
        {
            get
            {
                if (string.IsNullOrEmpty(_MauDapAnRtfCode))
                {
                    var stPath = System.IO.Path.Combine(AppDir, "TEMPLATE", "MauDapAn.rtf");
                    _MauDapAnRtfCode = System.IO.File.ReadAllText(stPath);
                }
                return _MauDapAnRtfCode;
            }
        }
        #endregion

        #region public static string MauDeThiRtfCode1 {}
        private static string _MauDeThiRtfCode1 = string.Empty;
        /// <summary>
        /// Mã RTF của mẫu đề thi
        /// Được lưu ở tệp StartupPath/TEMPLATE/MauDeThi.rtf
        /// </summary>
        public static string MauDeThiRtfCode1
        {
            get
            {
                if (string.IsNullOrEmpty(_MauDeThiRtfCode1))
                {
                    var stPath = System.IO.Path.Combine(AppDir, "TEMPLATE", "MauDeThi-1.rtf");
                    _MauDeThiRtfCode1 = System.IO.File.ReadAllText(stPath);
                }
                return _MauDeThiRtfCode1;
            }
        }
        #endregion

        #region public static string MauDapAnRtfCode1 {}
        private static string _MauDapAnRtfCode1 = string.Empty;
        /// <summary>
        /// Mã RTF của mẫu đáp án
        /// Được lưu ở tệp StartupPath/TEMPLATE/MauDapAn.rtf
        /// </summary>
        public static string MauDapAnRtfCode1
        {
            get
            {
                if (string.IsNullOrEmpty(_MauDapAnRtfCode1))
                {
                    var stPath = System.IO.Path.Combine(AppDir, "TEMPLATE", "MauDapAn-1.rtf");
                    _MauDapAnRtfCode1 = System.IO.File.ReadAllText(stPath);
                }
                return _MauDapAnRtfCode1;
            }
        }
        #endregion

        internal static IList<DeInRa> GetListDeInRa(string maDotThi)
        {
            using (var context = QLNHD_KHContext.GetContext())
            {
                var lst = context.DeInRaDbSet.Where(e => e.MaDotThi == maDotThi).ToList();
                return lst;
            }
        }

        internal static IList<DeInRa> GetListDeInRaWithTenHocPhan(string maDotThi)
        {
            using (var context = QLNHD_KHContext.GetContext())
            {
                var lst = context.DeInRaDbSet.Include("HocPhan").Where(e => e.MaDotThi == maDotThi).OrderBy(e => e.TenDeThi).ToList();
                return lst;
            }
        }

        internal static void XoaDeInRa(DeInRa dethi)
        {
            using (var context = QLNHD_KHContext.GetContext())
            {
                var oDeThi = context.DeInRaDbSet.
                    Include("CauHoiCollection").
                    Where(e => e.MaDeThi == dethi.MaDeThi).
                    FirstOrDefault();
                if (oDeThi == null)
                    throw new Exception("Đề thi không còn tồn tại trong hệ thống");
                context.DeInRaDbSet.Remove(oDeThi);
                context.SaveChanges();
                try
                {
                    var stDeThiPath =
                        //oDeThi.NoiDungDeThi;
                        System.IO.Path.Combine(QuanLyNganHangDe.GUI.Program.DeThiDirectoryPath, oDeThi.NoiDungDeThiFilePath_Relative);
                    if (System.IO.File.Exists(stDeThiPath))
                        System.IO.File.Delete(stDeThiPath);
                }
                catch (Exception exc) { QuanLyNganHangDe.GUI.Utils.Notify(null, "Không xoá tệp chứa đề thi được", exc.ToString()); }
                try
                {
                    var stDapAnPath =
                        //oDeThi.NoiDungDapAn;
                        //System.IO.Path.Combine(QuanLyNganHangDe.GUI.Program.DeThiDirectoryPath, oDeThi.NoiDungDapAn);
                        System.IO.Path.Combine(QuanLyNganHangDe.GUI.Program.DeThiDirectoryPath, oDeThi.NoiDungDapAnFilePath_Relative);
                    if (System.IO.File.Exists(stDapAnPath))
                        System.IO.File.Delete(stDapAnPath);
                }
                catch (Exception exc) { QuanLyNganHangDe.GUI.Utils.Notify(null, "Không xoá tệp chứa đáp án được", exc.ToString()); }
            }
        }

        internal static void UpdateNoiDungDapAn(DeInRa dethi, string rtfCode, QLNHD_KHContext context = null)
        {
            var releaseContext = context == null;
            try
            {
                if (context == null)
                    context = QLNHD_KHContext.GetContext();
                var oDeThi = context.DeInRaDbSet.Where(e => e.MaDeThi == dethi.MaDeThi).FirstOrDefault();
                if (oDeThi == null)
                    throw new Exception("Đề thi không còn tồn tại trong hệ thống");

                oDeThi.WriteNoiDungDapAn(rtfCode);
                context.SaveChanges();
                //dethi.NoiDungDapAn = rtfCode;
            }
            finally
            {
                if (releaseContext)
                    context.Dispose();
            }
        }

        internal static void UpdateNoiDungDeThi(DeInRa dethi, string rtfCode, QLNHD_KHContext context = null)
        {
            var releaseContext = context == null;
            try
            {
                if (context == null)
                    context = QLNHD_KHContext.GetContext();
                var oDeThi = context.DeInRaDbSet.Where(e => e.MaDeThi == dethi.MaDeThi).FirstOrDefault();
                if (oDeThi == null)
                    throw new Exception("Đề thi không còn tồn tại trong hệ thống");

                //oDeThi.NoiDungDeThi = rtfCode;
                oDeThi.WriteNoiDungDeThi(rtfCode);
                context.SaveChanges();
                //dethi.NoiDungDeThi = rtfCode;
            }
            finally
            {
                if (releaseContext)
                    context.Dispose();
            }
        }

        internal static void WriteNoiDungDeThi(this DeInRa dethi, string rtfcode)
        {
            #region Tạo thư mục tương ứng với Đợt thi
            string dotThiDirPath = System.IO.Path.Combine(GUI.Program.DeThiDirectoryPath, dethi.MaDotThi);
            if (System.IO.Directory.Exists(dotThiDirPath) == false)
                System.IO.Directory.CreateDirectory(dotThiDirPath);
            #endregion

            var stDuongDan = Path.Combine(GUI.Program.DeThiDirectoryPath, dethi.NoiDungDeThiFilePath_Relative);
            File.WriteAllText(stDuongDan, rtfcode);
        }

        internal static void WriteNoiDungDapAn(this DeInRa dethi, string rtfcode)
        {
            #region Tạo thư mục tương ứng với Đợt thi
            string dotThiDirPath = System.IO.Path.Combine(GUI.Program.DeThiDirectoryPath, dethi.MaDotThi);
            if (System.IO.Directory.Exists(dotThiDirPath) == false)
                System.IO.Directory.CreateDirectory(dotThiDirPath);
            #endregion

            var stDuongDan = Path.Combine(GUI.Program.DeThiDirectoryPath, dethi.NoiDungDapAnFilePath_Relative);
            File.WriteAllText(stDuongDan, rtfcode);
        }

        internal static string NoiDungDeThi_FullPath(this DeInRa dethi)
        {
            return Path.Combine(GUI.Program.DeThiDirectoryPath, dethi.NoiDungDeThiFilePath_Relative);
        }

        internal static string NoiDungDapAn_FullPath(this DeInRa dethi)
        {
            return Path.Combine(GUI.Program.DeThiDirectoryPath, dethi.NoiDungDapAnFilePath_Relative);
        }
    }
}
